#ifndef __GDDEVBASE_H__
#define __GDDEVBASE_H__
#include <stdio.h>
#include "mytype.h"




#define MAX_REG_BANK_COUNT        12  //档案最大数量
#define INV_MAX_REG_BANK_COUNT    12  //逆变器档案数量
#define SWITCH_MAX_REG_BANK_COUNT 12  //开关档案最大数量

#define no_resp_645         0xff  //不应答645

//广东协议精度
#define vol_gd_k            0.1
#define cur_gd_k            0.01
#define p_gd_k              0.1     //w
#define q_gd_k              0.1     //w
#define pf_gd_k             0.001   
#define p_pct_gd_k          0.1     ////百分比
#define q_pct_gd_k          0.1     ////百分比
#define deg_gd_k            0.01    


//广东协议串口
#define RJ45_port            1 //广东协议RJ451
#define RS4852_port          3 //广东协议4852


//广东配置值
#define gd_single         0 //逆变器输出 单项
#define gd_3_phase        1 //逆变器输出 三项

#define gd_data_2         2 //广东写入参数，2字节长度
#define gd_data_4         4 //广东写入参数，4字节长度
//广东协议精度和实际精度比例
#define pct_d_k             10000    //广东协议BCD码转bin后精度为10000  xxxx.xxxx
#define pct_gd_g            1000      //广东协议百分比精度为 xxx.x  0.1%  和实际百分比比例为1000 
//广东协议各个项的字节长度
#define vol_len       2
#define cur_len       3
#define p_len         4
#define q_len         4
#define pf_len        2
#define p_pct_len     2 //百分比
#define q_pct_len     2
#define deg_len       4
#define swt_stat_len  2 //开关状态，开关设备

//广东协议控制值
#define gd_run_on     0 //广东逆变器开
#define gd_run_off    1 //广东逆变器关

//广东协议控制类型
#define gd_p        0 //广东有功功率值控制
#define gd_p_pct    1 //广东有功功率百分比控制
#define gd_q        0 //广东无功功率值控制
#define gd_q_pct    1 //广东无功功率百分比控制

#define vol_block_len 6  //电压数据块长度
#define cur_block_len 9  //电流数据块长度
#define p_block_len  16  //有功功率数据块长度
#define q_block_len  16  //无功功率数据块长度
#define pf_block_len  8  //功率因数数据块长度
#define Switch_len    2  //开关状态（设备开关所有数据块才具备）
#define all_block_len vol_block_len+cur_block_len+p_block_len+q_block_len+pf_block_len //所有数据块长度

#define rated_p_block_len   4  //额定有功功率数据块长度
#define rated_q_block_len    4  //额定无功功率数据块长度
#define RunStatus_block_len 1  //运行状态数据块长度
#define deg_block_len       4  //日发电量数据块长度


#define inValid_value 0xff  //无效返回值


enum DEVNUM  //设备序号
{
    //光伏逆变器设备号
    inverterDEV1,
    inverterDEV2,
    inverterDEV3,
    inverterDEV4,
    inverterDEVMax, //设备序号最大值                                               
}; 


enum Converter_Type{//转化器的定义
  PV_Converter=10,    //光伏协议转化器
  DC_Converter=11,    //直流充电桩协议转化器
  AC_Converter=12,    //交流充电桩协议转化器
};


enum CtrResult{//
  ctr_success,
  ctr_falid,
};

enum regValidFlag{//
  
  inValidFlag=0,//无效
  vaildFlag=1,//有效
};

enum function_645{//
  read=1,
  write,
};



enum function_pct{//modbus百分比下发模式，这里考虑逆变器有没有百分比下发模式
  data_ctr,
  pct_ctr,
  
};



typedef struct
{
	  u8 regNum;      //当前寄存器数量
    
    u8 fc;     //功能码
    
    u16 regAddr;    
    
}Get_Frame_Type;

enum versionNum{
  SUNGROW_1_1_47=5,//阳光电源 中功率光伏并网逆变器通信协议 
  TOPSCOMM_1_0_4=42,//鼎信，广东协议没有，自定义
};

typedef struct
{
  u8 offset_start;
  u8 offset_end;
}OffSet;


enum DataBlockNum
{
  //只读
  vol_a=0,
  vol_b,
  vol_c,
  cur_a,
  cur_b,
  cur_c,
  p_a,
  p_b,
  p_c,
  p_all,
  q_a,
  q_b,
  q_c,
  q_all,
  pf_a,
  pf_b,
  pf_c,
  pf_all,
  rated_p,             
  rated_q,
  outType,
  deg,        //日发电量，单位以 kwh
  runStatus_rd,
  
   //只写
  runStatus_wr_open,
  runStatus_wr_close,
  p_set_model,
  p_set_num,

  q_set_model,
  q_set_num,
  
  pf_set_model,
  pf_set_num,


  p_pct_set_model,
  p_pct_set_num,

  q_pct_set_model,
  q_pct_set_num,
  
  AISWEI_q_set_model,

  switch_BitStatus, //开关状态
  

  feature_reg_1, //特征寄存器1
  feature_reg_2, //特征寄存器2
  feature_reg_3, //特征寄存器3

  max_num,
  
};

// #pragma pack(push, 1)
typedef struct StringItem  
{
  s8  flag; // 连续读取标记 1:后续数据与本数据连续读取,-1本块数据无效
  u8  type;     //1：BCD码，2：ASCII码
  u8  fc;  
  u8  len;
  u16 addr;
}StringItem;



typedef struct YcItem  //遥测块
{
  s8  flag; // 连续读取标记 1:后续数据与本数据连续读取,-1本块数据无效
  u8  type;     //DataType
  u16 addr;
  u8  reg_count; //寄存器数量
  // u8  fc_rd;
  // u8  fc_wr;
  u8  fc; 
  u16 mult;     //乘数
  u16 div;     //除数，不能为0
}YcItem;

typedef struct YkItem  //遥控块
{
  s8  flag; // 连续读取标记 1:有效,-1本块数据无效
  u8  fc;
  u16 addr;
  u16 val_data;
  // u16 val_off;
}YkItem;


typedef struct InvType  //逆变器类型
{
  s8  flag; // 连续读取标记 1:后续数据与本数据连续读取,-1本块数据无效
  u8  fc;
  u16 addr;
  u8  val_single;
  u8  val_3_phase_3_wire;
  u8  val_3_phase_4_wire;
  u8  def_type;   //默认类型（数据块无效时，配置单项还是三相）
}InvType;



typedef struct OutTypeg  
{
  u8  val_single        ;
  u8  val_3_phase_3_wire;
  u8  val_3_phase_4_wire;
  u8  def_type          ;             //默认类型（数据块无效时，配置单项还是三相）
}OutTypeg;

typedef struct YkItemg  //遥控块
{
  u16 val_data;
}YkItemg;

typedef struct Yk_TurnItemg  //遥控块
{
  u16 val_on;
  u16 val_off;
}Yk_TurnItemg;

typedef struct YcItemg //遥测试块
{
 
  u16 mult;     //乘数
  u16 div;     //除数，不能为0
}YcItemg;

typedef struct YtItemg //遥调试块
{
  u16 mult;     //乘数
  u16 div;     //除数，不能为0
}YtItemg;

typedef struct YtItemg_pct //遥调试块
{
  u16 mult;     //乘数
  u16 div;     //除数，不能为0
  u8  funtion; //控制方式，0 值控制，1：百分比
}YtItemg_pct;

typedef struct{
  s8 flag; // 连续读取标记 1:本数据块有效,-1本块数据无效
  u8 type;   //DataType:vol/cur/power/energy/
  u16 addr; //寄存器起始地址
  u8 reg_count; //寄存器数量
  u8  fc_rd;  
  u8  fc_wr;
  void *p; //p->YtItem /InvType

} Recode_Type;


// #pragma pack(pop)

typedef struct ReadDataBlock  //读数据块
{
  
  YcItem  vol[3];

  YcItem  cur[3];

  YcItem  p[4];//瞬时有功功率
  
  YcItem  q[4];//瞬时无功功率

  YcItem  pf[4];//功率因数

  YcItem  ratedP;

  YcItem  ratedq;

  YcItem  outType;

  YcItem  deg; //日发电量

  InvType invtype;
  
  YkItem runStatus;//运行状态

  YcItem  p_set;

  YcItem  q_set;

  YcItem  pf_set;

  YcItem  p_pct_set;

  YcItem  q_pct_set;




// 不需要实时读取，分开控制读取频率
  StringItem oem_id;   //厂商ID

  StringItem dev_id;

  StringItem product_id;

}ReadDataBlock;



typedef struct INV_RECODE  //逆变器档案
{

  ReadDataBlock readData;

  // ParameterBlock parameter;

}INV_RECODE;


#endif
